package practice;

// 编写代码, 实现线程安全版本的单例模式

// 以下实现懒汉模式的单例模式：懒汉模式本来是线程不安全的，但是可以进行改进，改进后安全

// 同样写一个类，其中有获取实例的方法，使用到该实例时才创建实例
// 注意 两层if + volatile可见性、禁止指令重排序!

class SingletonLazy {
    // 最初不实例化对象
    // 注意加上 volatile关键字修饰对象，避免指令重排序+可见性
    private volatile static SingletonLazy instance = null;

    // 获取对象的方法! 只有首次使用才实例化/创建对象
    public static SingletonLazy getInstance() {
        // 进行判断+实例化对象
        if(instance == null) {
            // 说明需要进行创建 + 加锁
            synchronized (SingletonLazy.class) {
                // 注意加锁对象
                // 再次判断：防止“可见性问题”
                if(instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

    // 私有构造方法，不能进行实例化
    private SingletonLazy() {

    }
}

public class Main2 {
    public static void main(String[] args) {
        SingletonLazy instance = SingletonLazy.getInstance();
        // 类方法的获取直接用类
    }
}
